You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
371 lines
14 KiB
371 lines
14 KiB
/*==LICENSE==* |
|
|
|
CyanWorlds.com Engine - MMOG client, server and tools |
|
Copyright (C) 2011 Cyan Worlds, Inc. |
|
|
|
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 3 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, see <http://www.gnu.org/licenses/>. |
|
|
|
Additional permissions under GNU GPL version 3 section 7 |
|
|
|
If you modify this Program, or any covered work, by linking or |
|
combining it with any of RAD Game Tools Bink SDK, Autodesk 3ds Max SDK, |
|
NVIDIA PhysX SDK, Microsoft DirectX SDK, OpenSSL library, Independent |
|
JPEG Group JPEG library, Microsoft Windows Media SDK, or Apple QuickTime SDK |
|
(or a modified version of those libraries), |
|
containing parts covered by the terms of the Bink SDK EULA, 3ds Max EULA, |
|
PhysX SDK EULA, DirectX SDK EULA, OpenSSL and SSLeay licenses, IJG |
|
JPEG Library README, Windows Media SDK EULA, or QuickTime SDK EULA, the |
|
licensors of this Program grant you additional |
|
permission to convey the resulting work. Corresponding Source for a |
|
non-source form of such a combination shall include the source code for |
|
the parts of OpenSSL and IJG JPEG Library used as well as that of the covered |
|
work. |
|
|
|
You can contact Cyan Worlds, Inc. by email legal@cyan.com |
|
or by snail mail at: |
|
Cyan Worlds, Inc. |
|
14617 N Newport Hwy |
|
Mead, WA 99021 |
|
|
|
*==LICENSE==*/ |
|
|
|
#include <Python.h> |
|
#include "pyKey.h" |
|
#pragma hdrstop |
|
|
|
#include "pyJournalBook.h" |
|
#include "pyEnum.h" |
|
#include "pyImage.h" |
|
|
|
#include "pfJournalBook/pfJournalBook.h" |
|
|
|
// glue functions |
|
PYTHON_CLASS_DEFINITION(ptBook, pyJournalBook); |
|
|
|
PYTHON_DEFAULT_NEW_DEFINITION(ptBook, pyJournalBook) |
|
PYTHON_DEFAULT_DEALLOC_DEFINITION(ptBook) |
|
|
|
PYTHON_INIT_DEFINITION(ptBook, args, keywords) |
|
{ |
|
char* kwlist[] = {"esHTMLSource", "coverImage", "callbackKey", "guiName", NULL}; |
|
PyObject* sourceObj = NULL; |
|
PyObject* coverObj = NULL; |
|
PyObject* callbackObj = NULL; |
|
char* guiName = NULL; |
|
if (!PyArg_ParseTupleAndKeywords(args, keywords, "O|OOs", kwlist, &sourceObj, &coverObj, &callbackObj, &guiName)) |
|
{ |
|
PyErr_SetString(PyExc_TypeError, "__init__ expects a string or unicode string, and optionally a ptImage, ptKey, and string"); |
|
PYTHON_RETURN_INIT_ERROR; |
|
} |
|
|
|
// convert all the optional arguments |
|
plKey coverKey = nil; |
|
if (coverObj) |
|
{ |
|
if (pyKey::Check(coverObj)) |
|
{ |
|
// this is really the callback key |
|
if (callbackObj) // callbackObj was already defined, can't have two keys |
|
{ |
|
PyErr_SetString(PyExc_TypeError, "__init__ expects a string or unicode string, and optionally a ptImage, ptKey, and string"); |
|
PYTHON_RETURN_INIT_ERROR; |
|
} |
|
callbackObj = coverObj; |
|
coverObj = nil; |
|
} |
|
else if (!pyImage::Check(coverObj)) |
|
{ |
|
PyErr_SetString(PyExc_TypeError, "__init__ expects a string or unicode string, and optionally a ptImage, ptKey, and string"); |
|
PYTHON_RETURN_INIT_ERROR; |
|
} |
|
else |
|
coverKey = pyImage::ConvertFrom(coverObj)->GetKey(); |
|
} |
|
|
|
plKey callbackKey = nil; |
|
if (callbackObj) |
|
{ |
|
if (!pyKey::Check(callbackObj)) |
|
{ |
|
PyErr_SetString(PyExc_TypeError, "__init__ expects a string or unicode string, and optionally a ptImage, ptKey, and string"); |
|
PYTHON_RETURN_INIT_ERROR; |
|
} |
|
callbackKey = pyKey::ConvertFrom(callbackObj)->getKey(); |
|
} |
|
|
|
plString guiNameStr; |
|
if (guiName) |
|
guiNameStr = plString::FromUtf8(guiName); |
|
|
|
// convert the sourcecode object |
|
if (PyUnicode_Check(sourceObj)) |
|
{ |
|
int len = PyUnicode_GetSize(sourceObj); |
|
wchar_t* temp = new wchar_t[len + 1]; |
|
PyUnicode_AsWideChar((PyUnicodeObject*)sourceObj, temp, len); |
|
temp[len] = L'\0'; |
|
|
|
std::wstring source = temp; |
|
delete [] temp; |
|
|
|
self->fThis->MakeBook(source, coverKey, callbackKey, guiNameStr); |
|
PYTHON_RETURN_INIT_OK; |
|
} |
|
else if (PyString_Check(sourceObj)) |
|
{ |
|
std::string source = PyString_AsString(sourceObj); |
|
|
|
self->fThis->MakeBook(source, coverKey, callbackKey, guiNameStr); |
|
PYTHON_RETURN_INIT_OK; |
|
} |
|
|
|
// source wasn't a string or unicode string |
|
PyErr_SetString(PyExc_TypeError, "__init__ expects a string or unicode string, and optionally a ptImage, ptKey, and string"); |
|
PYTHON_RETURN_INIT_ERROR; |
|
} |
|
|
|
PYTHON_METHOD_DEFINITION(ptBook, show, args) |
|
{ |
|
char startOpened; |
|
if (!PyArg_ParseTuple(args, "b", &startOpened)) |
|
{ |
|
PyErr_SetString(PyExc_TypeError, "show expects a boolean"); |
|
PYTHON_RETURN_ERROR; |
|
} |
|
self->fThis->Show(startOpened != 0); |
|
PYTHON_RETURN_NONE; |
|
} |
|
|
|
PYTHON_BASIC_METHOD_DEFINITION(ptBook, hide, Hide) |
|
|
|
PYTHON_METHOD_DEFINITION(ptBook, open, args) |
|
{ |
|
unsigned long startingPage; |
|
if (!PyArg_ParseTuple(args, "l", &startingPage)) |
|
{ |
|
PyErr_SetString(PyExc_TypeError, "open expects an unsigned long"); |
|
PYTHON_RETURN_ERROR; |
|
} |
|
self->fThis->Open(startingPage); |
|
PYTHON_RETURN_NONE; |
|
} |
|
|
|
PYTHON_BASIC_METHOD_DEFINITION(ptBook, close, Close) |
|
PYTHON_BASIC_METHOD_DEFINITION(ptBook, closeAndHide, CloseAndHide) |
|
|
|
PYTHON_BASIC_METHOD_DEFINITION(ptBook, nextPage, NextPage) |
|
PYTHON_BASIC_METHOD_DEFINITION(ptBook, previousPage, PreviousPage) |
|
|
|
PYTHON_METHOD_DEFINITION(ptBook, goToPage, args) |
|
{ |
|
unsigned long page; |
|
if (!PyArg_ParseTuple(args, "l", &page)) |
|
{ |
|
PyErr_SetString(PyExc_TypeError, "goToPage expects an unsigned long"); |
|
PYTHON_RETURN_ERROR; |
|
} |
|
self->fThis->GoToPage(page); |
|
PYTHON_RETURN_NONE; |
|
} |
|
|
|
PYTHON_METHOD_DEFINITION(ptBook, setSize, args) |
|
{ |
|
float width, height; |
|
if (!PyArg_ParseTuple(args, "ff", &width, &height)) |
|
{ |
|
PyErr_SetString(PyExc_TypeError, "setSize expects two floats"); |
|
PYTHON_RETURN_ERROR; |
|
} |
|
self->fThis->SetSize(width, height); |
|
PYTHON_RETURN_NONE; |
|
} |
|
|
|
PYTHON_METHOD_DEFINITION_NOARGS(ptBook, getCurrentPage) |
|
{ |
|
return PyLong_FromUnsignedLong(self->fThis->GetCurrentPage()); |
|
} |
|
|
|
PYTHON_METHOD_DEFINITION(ptBook, allowPageTurning, args) |
|
{ |
|
char allow; |
|
if (!PyArg_ParseTuple(args, "b", &allow)) |
|
{ |
|
PyErr_SetString(PyExc_TypeError, "allowPageTurning expects a boolean"); |
|
PYTHON_RETURN_ERROR; |
|
} |
|
self->fThis->AllowPageTurning(allow != 0); |
|
PYTHON_RETURN_NONE; |
|
} |
|
|
|
PYTHON_METHOD_DEFINITION(ptBook, setPageMargin, args) |
|
{ |
|
unsigned long margin; |
|
if (!PyArg_ParseTuple(args, "l", &margin)) |
|
{ |
|
PyErr_SetString(PyExc_TypeError, "setPageMargin expects an unsigned long"); |
|
PYTHON_RETURN_ERROR; |
|
} |
|
self->fThis->SetPageMargin(margin); |
|
PYTHON_RETURN_NONE; |
|
} |
|
|
|
PYTHON_METHOD_DEFINITION(ptBook, setGUI, args) |
|
{ |
|
char* guiName; |
|
if (!PyArg_ParseTuple(args, "s", &guiName)) |
|
{ |
|
PyErr_SetString(PyExc_TypeError, "setGUI expects a string"); |
|
PYTHON_RETURN_ERROR; |
|
} |
|
self->fThis->SetGUI(plString::FromUtf8(guiName)); |
|
PYTHON_RETURN_NONE; |
|
} |
|
|
|
PYTHON_METHOD_DEFINITION(ptBook, getMovie, args) |
|
{ |
|
unsigned char index; |
|
if (!PyArg_ParseTuple(args, "b", &index)) |
|
{ |
|
PyErr_SetString(PyExc_TypeError, "getMovie expects a unsigned 8-bit int"); |
|
PYTHON_RETURN_ERROR; |
|
} |
|
return self->fThis->GetMovie(index); |
|
} |
|
|
|
PYTHON_METHOD_DEFINITION(ptBook, setEditable, args) |
|
{ |
|
char editable; |
|
if (!PyArg_ParseTuple(args, "b", &editable)) |
|
{ |
|
PyErr_SetString(PyExc_TypeError, "setEditable expects a boolean"); |
|
PYTHON_RETURN_ERROR; |
|
} |
|
self->fThis->SetEditable(editable != 0); |
|
PYTHON_RETURN_NONE; |
|
} |
|
|
|
PYTHON_METHOD_DEFINITION(ptBook, getEditableText, args) |
|
{ |
|
return PyString_FromString(self->fThis->GetEditableText().c_str()); |
|
} |
|
|
|
PYTHON_METHOD_DEFINITION(ptBook, setEditableText, args) |
|
{ |
|
char* text; |
|
if (!PyArg_ParseTuple(args, "s", &text)) |
|
{ |
|
PyErr_SetString(PyExc_TypeError, "setEditableText expects a string"); |
|
PYTHON_RETURN_ERROR; |
|
} |
|
self->fThis->SetEditableText(text); |
|
PYTHON_RETURN_NONE; |
|
} |
|
|
|
PYTHON_START_METHODS_TABLE(ptBook) |
|
PYTHON_METHOD(ptBook, show, "Params: startOpened\nShows the book closed, or open if the the startOpened flag is true"), |
|
PYTHON_BASIC_METHOD(ptBook, hide, "Hides the book"), |
|
PYTHON_METHOD(ptBook, open, "Params: startingPage\nOpens the book to the specified page"), |
|
PYTHON_BASIC_METHOD(ptBook, close, "Closes the book"), |
|
PYTHON_BASIC_METHOD(ptBook, closeAndHide, "Closes the book and hides it once it finishes animating"), |
|
PYTHON_BASIC_METHOD(ptBook, nextPage, "Flips the book to the next page"), |
|
PYTHON_BASIC_METHOD(ptBook, previousPage, "Flips the book to the previous page"), |
|
PYTHON_METHOD(ptBook, goToPage, "Params: page\nFlips the book to the specified page"), |
|
PYTHON_METHOD(ptBook, setSize, "Params: width,height\nSets the size of the book (width and height are floats from 0 to 1)"), |
|
PYTHON_METHOD_NOARGS(ptBook, getCurrentPage, "Returns the currently shown page"), |
|
PYTHON_METHOD(ptBook, allowPageTurning, "Params: allow\nTurns on and off the ability to flip the pages in a book"), |
|
PYTHON_METHOD(ptBook, setPageMargin, "Params: margin\nSets the text margin for the book"), |
|
PYTHON_METHOD(ptBook, setGUI, "Params: guiName\nSets the gui to be used by the book, if the requested gui is not loaded, it will use the default\nDo not call while the book is open!"), |
|
PYTHON_METHOD(ptBook, getMovie, "Params: index\nGrabs a ptAnimation object representing the movie indexed by index. The index is the index of the movie in the source code"), |
|
PYTHON_METHOD(ptBook, setEditable, "Params: editable\nTurn book editing on or off. If the book GUI does not support editing, nothing will happen"), |
|
PYTHON_METHOD(ptBook, getEditableText, "Returns the editable text currently contained in the book."), |
|
PYTHON_METHOD(ptBook, setEditableText, "Params: text\nSets the book's editable text."), |
|
PYTHON_END_METHODS_TABLE; |
|
|
|
// Type structure definition |
|
PLASMA_DEFAULT_TYPE(ptBook, "Params: esHTMLSource,coverImage=None,callbackKey=None,guiName=''\nCreates a new book"); |
|
|
|
// required functions for PyObject interoperability |
|
PyObject *pyJournalBook::New(std::string htmlSource, plKey coverImageKey /* = nil */, plKey callbackKey /* = nil */, plString guiName /* = "" */) |
|
{ |
|
ptBook *newObj = (ptBook*)ptBook_type.tp_new(&ptBook_type, NULL, NULL); |
|
newObj->fThis->MakeBook(htmlSource, coverImageKey, callbackKey, guiName); |
|
return (PyObject*)newObj; |
|
} |
|
|
|
PyObject *pyJournalBook::New(std::wstring htmlSource, plKey coverImageKey /* = nil */, plKey callbackKey /* = nil */, plString guiName /* = "" */) |
|
{ |
|
ptBook *newObj = (ptBook*)ptBook_type.tp_new(&ptBook_type, NULL, NULL); |
|
newObj->fThis->MakeBook(htmlSource, coverImageKey, callbackKey, guiName); |
|
return (PyObject*)newObj; |
|
} |
|
|
|
PYTHON_CLASS_CHECK_IMPL(ptBook, pyJournalBook) |
|
PYTHON_CLASS_CONVERT_FROM_IMPL(ptBook, pyJournalBook) |
|
|
|
/////////////////////////////////////////////////////////////////////////// |
|
// |
|
// AddPlasmaClasses - the python module definitions |
|
// |
|
void pyJournalBook::AddPlasmaClasses(PyObject *m) |
|
{ |
|
PYTHON_CLASS_IMPORT_START(m); |
|
PYTHON_CLASS_IMPORT(m, ptBook); |
|
PYTHON_CLASS_IMPORT_END(m); |
|
} |
|
|
|
PYTHON_GLOBAL_METHOD_DEFINITION(PtLoadBookGUI, args, "Params: guiName\nLoads the gui specified, a gui must be loaded before it can be used. If the gui is already loaded, doesn't do anything") |
|
{ |
|
char* guiName; |
|
if (!PyArg_ParseTuple(args, "s", &guiName)) |
|
{ |
|
PyErr_SetString(PyExc_TypeError, "PtLoadBookGUI expects a string"); |
|
PYTHON_RETURN_ERROR; |
|
} |
|
pyJournalBook::LoadGUI(plString::FromUtf8(guiName)); |
|
PYTHON_RETURN_NONE; |
|
} |
|
|
|
PYTHON_GLOBAL_METHOD_DEFINITION(PtUnloadBookGUI, args, "Params: guiName\nUnloads the gui specified. If the gui isn't loaded, doesn't do anything") |
|
{ |
|
char* guiName; |
|
if (!PyArg_ParseTuple(args, "s", &guiName)) |
|
{ |
|
PyErr_SetString(PyExc_TypeError, "PtUnloadBookGUI expects a string"); |
|
PYTHON_RETURN_ERROR; |
|
} |
|
pyJournalBook::UnloadGUI(plString::FromUtf8(guiName)); |
|
PYTHON_RETURN_NONE; |
|
} |
|
|
|
PYTHON_BASIC_GLOBAL_METHOD_DEFINITION(PtUnloadAllBookGUIs, pyJournalBook::UnloadAllGUIs, "Unloads all loaded guis except for the default one") |
|
|
|
void pyJournalBook::AddPlasmaMethods(std::vector<PyMethodDef> &methods) |
|
{ |
|
PYTHON_GLOBAL_METHOD(methods, PtLoadBookGUI); |
|
PYTHON_GLOBAL_METHOD(methods, PtUnloadBookGUI); |
|
PYTHON_BASIC_GLOBAL_METHOD(methods, PtUnloadAllBookGUIs); |
|
} |
|
|
|
void pyJournalBook::AddPlasmaConstantsClasses(PyObject *m) |
|
{ |
|
PYTHON_ENUM_START(PtBookEventTypes); |
|
PYTHON_ENUM_ELEMENT(PtBookEventTypes, kNotifyImageLink, pfJournalBook::kNotifyImageLink); |
|
PYTHON_ENUM_ELEMENT(PtBookEventTypes, kNotifyShow, pfJournalBook::kNotifyShow); |
|
PYTHON_ENUM_ELEMENT(PtBookEventTypes, kNotifyHide, pfJournalBook::kNotifyHide); |
|
PYTHON_ENUM_ELEMENT(PtBookEventTypes, kNotifyNextPage, pfJournalBook::kNotifyNextPage); |
|
PYTHON_ENUM_ELEMENT(PtBookEventTypes, kNotifyPreviousPage, pfJournalBook::kNotifyPreviousPage); |
|
PYTHON_ENUM_ELEMENT(PtBookEventTypes, kNotifyCheckUnchecked, pfJournalBook::kNotifyCheckUnchecked); |
|
PYTHON_ENUM_ELEMENT(PtBookEventTypes, kNotifyClose, pfJournalBook::kNotifyClose); |
|
PYTHON_ENUM_END(m, PtBookEventTypes); |
|
}
|
|
|