Home > Products > SophiaFramework UNIVERSE > Details

SophiaFramework UNIVERSE Details

Index

  1. The Effects of SophiaFramework UNIVERSE
  2. GUI Framework
    1. GUI Environment
    2. Event Handling Encapsulation
    3. GUI Components
  3. Utilities
    1. Mobile SOAP / XML
      1. SOAP / XML
      2. Secure Web Service over HTTPS
    2. Network
      1. Class Managing Host Names and Port Addresses
      2. TCP Socket Class
      3. UDP Socket Communication Programming
      4. SSL Socket Programming
      5. HTTP / HTTPS Communication Class
      6. POP3 / SMTP Mail Transmission / Reception
    3. File
      1. File Path Class ( SFXPath )
      2. Directory Class ( SFXDirectory )
      3. File Class ( SFXFile )
    4. Stream
      1. I / O Class for Binary Data
      2. I / O Class for String Data
    5. Buffer
    6. String
      1. Intuitive Handling of Strings
      2. Converting ANSI Strings and Wide Strings
      3. Functions for String Operations
    7.  Shapes (Graphics)
    8.  Color
    9.  Collection
    10. Mathematical Operations
    11. General Purpose Utilities
    12. Debugging
  4. BREW C++ Wrappers

The Effects of SophiaFramework UNIVERSE

GUI environment for BREW is available.    GUI Framework
Useful C++ class libraries for BREW application development are available.    Utility
  1. The procedure for accessing Web services by WSDL / SOAP communication can be programmed with only 10 lines of C++ code. Secure Web services supporting SSL can be easily implemented.    Mobile SOAP / XML
  2. Classes for HTTP / HTTPS, POP3 / SMTP, SSL, TCP / IP and UDP are available.    Network
  3. Operations with files, and directory or file paths are programmed intuitively.    File
  4. File or network stream operations are straightforward.    Stream
  5. Memory is automatically allocated and released.    Buffer
  6. String operations can be programmed intuitively.    String
  7. Programing shape operations becomes straightforward.    Shape
  8. Color operations are very easy.    Color
  9. Mutable data operations are effortless.    Collection
  10. Math functions like floating-point operation, trigonometric functions and exponentials are available.     Mathematics
  11. Classes for date calculation or endian conversion are also implemented.     General
  12. Memory leaks are automatically detected.    Debug
C++ wrappers for BREW APIs are available.    BREW C++ Wrapper

GUI Framework

GUI Environment

Problem with BREW

It is difficult to implement GUI event handling and window drawing on BREW.

Solution by SophiaFramework UNIVERSE

SophiaFramework UNIVERSE provides a GUI framework that facilitates GUI implementation.

SophiaFramework UNIVERSE GUI environment features:

Event Handling Encapsulation

Problem with BREW

Event handling must be implemented in order to use a GUI, but maintenance of programs that include event handling can be complicated.

Solution by SophiaFramework UNIVERSE

SophiaFramework UNIVERSE has pre-registered event handlers that can be used without any need for complicated implementations.

GUI Components

Problem with BREW

UI components must be custom made for every BREW application.

Solution by SophiaFramework UNIVERSE

SophiaFramework UNIVERSE provides flexible window designs and GUI elements such as menus, dialog-boxes and tabs.

SophiaFramework UNIVERSE sample code for adding a button to a window:

 SFRFrameWindow* win = new SFRWindow(this, rect);
 SFRButtonControl* button = new SFRButtonControl(win, rect2, "BUTTON");

Utilities

Mobile SOAP / XML

SOAP / XML

Problem with BREW

Even with SOAP / XML middleware, coding of more than 1000 lines is necessary to implement SOAP communication.

Solution by SophiaFramework UNIVERSE

With SOAP / XML classes included in SophiaFramework 4.0, SOAP communication can be programmed in less than 10 C++ operations.

// class variable

SFXSOAPRPC _rpc

// set a method name of Web service
_rpc.SetMethodName("ItemSearch");

// set a targeted URI

_rpc.SetTargetObjectURI("http://webservices.amazon.com/");

// set parameters of Web service 

_rpc.AddParameter("AWSAccessKeyId", 
                  SFXBuffer(SFXAnsiString("0FV0D3E595H0FH4P1VR2")));
_rpc.AddParameter("Keywords", 
                  SFXBuffer(SFXAnsiString("caviar")));
_rpc.AddParameter("MerchantId", 
                  SFXBuffer(SFXAnsiString("Amazon")));
_rpc.AddParameter("SearchIndex", 
                  SFXBuffer(SFXAnsiString("GourmetFood")));

// call the Web service
_rpc.Invoke("http://soap.amazon.com/onca/soap?Service=AWSECommerceService", 
            "http://soap.amazon.com", 
            OnResultSHP_SOAP, 
            this);

Secure Web Service over HTTPS

SophiaFramework UNIVERSE has a SFXSOAPRPC class that implements the SOAP-RPC protocol, which can communicate over HTTPS.

SFXSOAPRPC over HTTPS
// class variable

SFXSOAPRPC _rpc

// set a method name of Web service
_rpc.SetMethodName("ItemSearch");

// set a targeted URI

_rpc.SetTargetObjectURI("https://webservices.amazon.com/");

// set parameters of Web service 

_rpc.AddParameter("AWSAccessKeyId", 
                  SFXBuffer(SFXAnsiString("0FV0D3E595H0FH4P1VR2")));
_rpc.AddParameter("Keywords", 
                  SFXBuffer(SFXAnsiString("caviar")));
_rpc.AddParameter("MerchantId", 
                  SFXBuffer(SFXAnsiString("Amazon")));
_rpc.AddParameter("SearchIndex", 
                  SFXBuffer(SFXAnsiString("GourmetFood")));

// set a mode of SSL validation

_wsdl.SetTrustMode(SSL_TRUST_MODE_IGNORE);

// call the Web service
_rpc.Invoke("https://soap.amazon.com/onca/soap?Service=AWSECommerceService", 
            "https://soap.amazon.com", 
            OnResultSHP_SOAP, 
            this);

Network

Class Managing Host Names and Port Addresses ( SFXSocketAddress )

Problem with BREW

Addresses for Sockets should be IP addresses, thus host names must be converted into IP addresses.

Solution by SophiaFramework UNIVERSE

Host names are automatically converted into IP addresses. There is no need to manage the context for host name resolution.

// As a host name is automatically resolved with SFXTCPSocket,
// The following code does not need to be programmed.

// class variable

SFXSocketAddress _socket;

CHelloWorld::CHelloWorld(Void) static_throws
{
    // set Host

    _socket.Set("www.s-cradle.com:8080");

    // get the number of resolved IP addresses

    TRACE("ip count = %d", _socket.GetCount());

    // display Host

    TRACE(" host = %s", _socket.Get().GetCString());

    // resolve IP address from Host Name 

    _socket.Resolve(CALLBACK_FUNCTION(OnResolve));
    return;
}

CALLBACK_IMPLEMENT_SFXSOCKETADDRESS(CHelloWorld, OnResolve, error)
{
    // get the number of resolved IP addresses

    TRACE("ip count = %d", _socket.GetCount());

    // display Host

    TRACE("host = %s:%d", _socket.GetIP(0).GetCString(), 
                                    _socket.GetPort());
    return;
}

TCP Socket Class ( SFXTCPSocket )

Problem with BREW

To implement TCP / IP communication, the interfaces of INetMgr and ISocket should be used to send and receive data asynchronously by callbacks. Programming for creation and restoration of fragmented data is very difficult, and the risk of bugs is high.

Solution by SophiaFramework UNIVERSE

With the SFXTCPSocket class, interfaces of INetMgr and ISocket are automatically controled. As data is sent or received through the buffered Stream class, programming for its context management is very concise.

// class variables

SFXTCPSocket _socket;
SFXAnsiStringStreamWriter _writer;
SFXAnsiStringStreamReader _reader;

CHelloWorld::CHelloWorld(Void) static_throws
{
    SFXSocketAddress host("www.s-cradle.com:80");

    // open Socket

    _socket.Open();

    // connect www.s-cradle.com:80 
    // host name is automatically resolved

    _socket.Connect(host, CALLBACK_FUNCTION(OnConnect));
    return;
}

CALLBACK_IMPLEMENT_SFXTCPSOCKET(CHelloWorld, OnConnect, error)
{
    // get SFXAnsiStringStreamWriter from a ring buffer of 1024 bytes

    _socket.GetStreamWriter(1024, &_writer);

    // write data onto a ring buffer

    _writer << "GET / HTTP/1.0\r\n"; 

    // send data

    _writer.Flush(CALLBACK_FUNCTION(OnFlush));
    return;
}

CALLBACK_IMPLEMENT_SFXANSISTRINGSTREAMWRITER(CHelloWorld, 
                                             OnFlush, 
                                             error)
{
    // release SFXAnsiStringStreamWriter

    _writer.Release();

    // get SFXAnsiStringStreamReader from a ring buffer of 1024 bytes

    _socket.GetStreamReader(1024, &_reader);

    // receive data

    _reader.Fetch(CALLBACK_FUNCTION(OnFetch));
    return;
}

CALLBACK_IMPLEMENT_SFXANSISTRINGSTREAMREADER(CHelloWorld, 
                                             OnFetch, 
                                             error)
{
    SFXAnsiString str;

    // read data from a ring buffer

    _reader >> str;

    // display a response

    TRACE("%s", str.GetCString());

    // release SFXAnsiStringStreamReader

    _reader.Release();

    // close Socket

    _socket.Close();
    return;
}

UDP Socket Communication Programming ( SFXUDPSocket )

Problem with BREW

To implement UDP communication, interfaces of TCP / IP, INetMgr and ISocket should be used to manage the sending and receiving of data asynchronously by Callback.

Solution by SophiaFramework UNIVERSE

With the SFXUDPSocket class, interfaces of INetMgr and ISocket are automatically managed. Data is sent or received through the buffered Stream class, and programming for its context management is very concise.

// class variable

SFXUDPSocket _socket;

Void SFXStorageExplainer::_SFXUDPSocket(Void)
{
    // open a socket

	_socket.Open();

    // bind IP address and port number with the socket 
    
    _SFXUDPSocket_OnBind(SFERR_NO_ERROR);
    return;
}

CALLBACK_IMPLEMENT_SFXUDPSOCKET(SFXStorageExplainer, 
                                _SFXUDPSocket_OnBind, 
                                error)
{
    switch (_socket.Bind(SFXSocketAddress(
             SFXInetAddress::LoopbackInetAddress(), 1024))) {
        case SFERR_NO_ERROR:

            // write data asynchronously

            _SFXUDPSocket_OnSend(SFERR_NO_ERROR);
            break;
        case AEE_NET_WOULDBLOCK:

            // register a callback function

            _socket.ScheduleBind(
                    CALLBACK_FUNCTION(_SFXUDPSocket_OnBind));
        	break;
    }
    return;
}

CALLBACK_IMPLEMENT_SFXUDPSOCKET(SFXStorageExplainer, 
                                _SFXUDPSocket_OnSend, 
                                error)
{
    static ACharConst data[] = "udp!";
    UInt32 size;

    size = sizeof(data) - 1;
    switch (_socket.Send(SFXSocketAddress(
                         SFXInetAddress::LoopbackInetAddress(), 1024), 
                         data, 
                         &size)) {
        case SFERR_NO_ERROR:

            // Check whether data of size specified is sent. 
            // All the data of size sepecified by Send()  
            // is not always sent simultaneously 
            // To simplify the logic, 
            // if all the data cannot be sent simultaneously,
            // an error will ocurr in the following code.

            if (size == sizeof(data) - 1) {

                // read data asynchronously

                _SFXUDPSocket_OnReceive(SFERR_NO_ERROR);
            }
            else {
                TRACE("...send failed...");
            }
            break;
        case AEE_NET_WOULDBLOCK:

            // register a callback function

            _socket.ScheduleSend(
                    CALLBACK_FUNCTION(_SFXUDPSocket_OnSend));
            break;
    }
    return;
}

CALLBACK_IMPLEMENT_SFXUDPSOCKET(SFXStorageExplainer, 
                                _SFXUDPSocket_OnReceive, 
                                error)
{
    SFXSocketAddress socket;
    SFXBuffer buffer;
    UInt32 size;

    buffer.SetSize(4);
    size = static_cast<UInt16>(buffer.GetSize());
    switch (_socket.Receive(&socket, buffer.GetBuffer(), &size)) {
        case SFERR_NO_ERROR:

            // Check whether data of size specified is sent. 
            // All the data of size sepecified by Send()  
            // is not always sent simultaneously 
            // To simplify the logic, 
            // if all the data cannot be sent simultaneously,
            // an error will ocurr in the following code.

            if (size == buffer.GetSize()) {

                // display data received

                buffer.SetSize(buffer.GetSize() + 1);
                buffer[buffer.GetSize() - 1] = '\0';
                TRACE(":%s", SFXAnsiString(buffer).GetCString());

                // close the socket

                _socket.Close();
            }
            else {
                TRACE("...receive failed...");
            }
            break;
        case AEE_NET_WOULDBLOCK:

            // register a callback function

            _socket.ScheduleReceive(
                    CALLBACK_FUNCTION(_SFXUDPSocket_OnReceive));
            break;
    }
    return;
}

SSL Socket Programming ( SFXSSLSocket )

Problem with BREW

To implement SSL communication, interfaces such as INetMgr, ISocket, ISSL and ISSLRootCerts should be used and their context for communication explicitly managed.

Solution by SophiaFramework UNIVERSE

SSL communication can be programmed in a manner almost identical to that of the SFXTCPSocket class. Its communication context is automatically managed.

* SSL: Secure Socket Layer is an Internet protocol that encrypts data, enabling the transmission and reception of private documents.

Using SFXSSLSocket
// class variables

SFXSSLSocket _socket;
SFXAnsiStringStreamWriter _writer;
SFXAnsiStringStreamReader _reader;

CHelloWorld::CHelloWorld(Void) static_throws
{
    SFXSocketAddress host("rollovertest2.verisign.co.jp:443");

    // open the socket

    _socket.Open();

    // connect rollovertest2.verisign.co.jp:443 
    // host name wiil be automatically resolved

    _socket.Connect(host, CALLBACK_FUNCTION(OnConnect));
    return;
}

CALLBACK_IMPLEMENT_SFXSSLSOCKET(CHelloWorld, OnConnect, error)
{
    _socket.Negotiate(CALLBACK_FUNCTION(OnNegotiate));
    return;
}

CALLBACK_IMPLEMENT_SFXSSLSOCKET(CHelloWorld, OnNegotiate, error)
{
    // get SFXAnsiStringStreamWriter by the ring buffer of 1024 bytes

    _socket.GetStreamWriter(1024, &_writer);

    // write data onto the ring buffer

    _writer << "GET / HTTP/1.0\r\n\r\n"; 

    // send data

    _writer.Flush(CALLBACK_FUNCTION(OnFlush));
    return;
}

CALLBACK_IMPLEMENT_SFXANSISTRINGSTREAMWRITER(CHelloWorld, OnFlush, error)
{
    // release SFXAnsiStringStreamWriter after sendind data

    _writer.Release();

    // get SFXAnsiStringStreamReader by the ring buffer of 1024 bytes

    _socket.GetStreamReader(1024, &_reader);

    // receive data

    _reader.Fetch(CALLBACK_FUNCTION(OnFetch));
    return;
}

CALLBACK_IMPLEMENT_SFXANSISTRINGSTREAMREADER(CHelloWorld, OnFetch, error)
{
    SFXAnsiString str;

    // read data from the ring buffer

    _reader >> str;

    // display the response 

    TRACE("%s", str.GetCString());

    // release SFXAnsiStringStreamReader after receiving data
    
    _reader.Release();

    // close the socket
    
    _socket.Close();
    return;
}
Using SFXTCPSocket
// class variables

SFXTCPSocket _socket;
SFXAnsiStringStreamWriter _writer;
SFXAnsiStringStreamReader _reader;

CHelloWorld::CHelloWorld(Void) static_throws
{
    SFXSocketAddress host("www.verisign.co.jp:80");

    // open socket

    _socket.Open();

    // connect www.verisign.co.jp:80
    // host name wiil be automatically resolved

    _socket.Connect(host, CALLBACK_FUNCTION(OnConnect));
    return;
}

CALLBACK_IMPLEMENT_SFXTCPSOCKET(CHelloWorld, OnConnect, error)
{
    // get SFXAnsiStringStreamWriter by the ring buffer of 1024 bytes
 
    _socket.GetStreamWriter(1024, &_writer);

   // write data onto the ring buffer

    _writer << "GET / HTTP/1.0\r\n\r\n"; 

    // send data

    _writer.Flush(CALLBACK_FUNCTION(OnFlush));
    return;
}

CALLBACK_IMPLEMENT_SFXANSISTRINGSTREAMWRITER(CHelloWorld, OnFlush, error)
{
    // release SFXAnsiStringStreamWriter after sendind data

    _writer.Release();

    // get SFXAnsiStringStreamReader by the ring buffer of 1024 bytes

    _socket.GetStreamReader(1024, &_reader);

    // receive data

    _reader.Fetch(CALLBACK_FUNCTION(OnFetch));
    return;
}

CALLBACK_IMPLEMENT_SFXANSISTRINGSTREAMREADER(CHelloWorld, OnFetch, error)
{
    SFXAnsiString str;

    // read data from the ring buffer

    _reader >> str;

    // display the response

    TRACE("%s", str.GetCString());

    // release SFXAnsiStringStreamReader after receiving data

    _reader.Release();

    // close the socket

    _socket.Close();
    return;
}

HTTP / HTTPS Communication Class ( SFXHTTPConnection )

Problem with BREW

To implement HTTP / HTTPS communication, interfaces such as IWeb, IWebResp, ISSLRootCerts, ISource should be used, and the sending / receiving of data should be explicitly managed until the communication is over.

Solution by SophiaFramework UNIVERSE

All interfaces and sent / received data are automatically managed. HTTP / HTTPS communication can be implemented in a way similar to the HttpURLConnection in Java.

// class variables

SFXHTTPConnection _http;
SFXAnsiStringStreamReader _reader;

CHelloWorld::CHelloWorld(Void) static_throws
{
    // open

    _http.Open();

    // set the User-Agent field

    _http.SetUserAgent("SophiaFramework 4.0");

    // connect the web site

    _http.Connect("/index.html", 
                  CALLBACK_FUNCTION(OnConnect));
    return;
}

CALLBACK_IMPLEMENT_SFXHTTPCONNECTION(CHelloWorld, OnConnect, error)
{
    SFXPropertyConstPtr header;
    SInt16 i;

    // get the result code

    TRACE("result = %d", _http.GetResultCode());

    // get the Content-Length field

    TRACE("length = %d", _http.GetLength());

    // get Date field

    TRACE("date = %s", 
          _http.GetDate().Format("YYYY/MM/DD hh:mm:ss (Wek)").GetCString());

    // display header information of received data

    TRACE("---header dump---");

    header = &_http.GetResponseHeader();
    for (i = 0; i < header->GetSize(); ++i) {
        TRACE("%s: %s", 
              header->GetKey(i).GetCString(), 
              header->GetValue(i).GetCString());
    }

    TRACE("---header dump---");

    // get SFXAnsiStringStreamReader from a ring buffer of 1024 bytes

    _http.GetStreamReader(1024, &_reader);

    // receive body of data

    _reader.Fetch(CALLBACK_FUNCTION(OnFetch));
    return;
}

CALLBACK_IMPLEMENT_SFXANSISTRINGSTREAMREADER(CHelloWorld, OnFetch, error)
{
    SFXAnsiString str;

    // read received data from a ring buffer

    _reader >> str;

    TRACE("%s", str.GetCString());

    // release after data is received
    // note : if data body is bigger than ring buffer,
    //        you can receive more data by Fetch() function 

    _reader.Release();

    // close

    _http.Close();
    return;
}

POP3 / SMTP ( SFXPOP3Receiver / SFXSMTPSender ) Mail Transmission / Reception

Problem with BREW

There is no interfaces for POP3 or SMTP protocol. Procedures such as sending and receiving data with a server, or management of mail data must be implemented by the developer.

Solution by SophiaFramework UNIVERSE

With the POP3 or SMTP classes, implementing the process of sending and receiving mail only takes a few lines program code. Other useful classes such as management of mail data and encoding conversion are also provided.

Sending Mail ( SFXSMTPSender )
class MyClass {
private:
    SFXSMTPSender _sender;
    CALLBACK_DECLARE_SFXSMTPSENDER(SMTPCallback)
public:
    Void Function(Void);
};

Void MyClass::Function(Void)
{
    SFXMailMessage message;

    // set "From" Address

    message.SetFromField("fromaddress@example.com");

    // set "To" Address

    message.AddToField("toaddress1@example.com");
    message.AddToField("toaddress2@example.com");

    // set Title

    message.SetSubjectField("Mail Subject");

    // set Text

    message.SetBody("Mail test\r\nThis mail is sent by SFXSMTPSender.\r\n");

    // set Mail Server for sending and Port Number
    // ( domain is automatically resolved )

    _sender.SetServer(SFXSocketAddress("smtpserver.example.com:25"));

    // send a mail ( register callback function )

    _sender.SendMessage(&message, CALLBACK_FUNCTION(SMTPCallback));
}

// callback funtion for sending a mail
CALLBACK_IMPLEMENT_SFXSMTPSENDER(MyClass, SMTPCallback, error)
{
    TRACE("Your mail has been sent.");
}
Receiving Mail ( SFXPOP3Receiver )
class MyClass {
private:
    SFXPOP3Receiver _receiver;
    CALLBACK_DECLARE_SFXPOP3RECEIVER(POP3Callback)
public:
    Void Function(Void);
};

Void MyClass::Function(Void)
{
    // set an account

    _receiver.SetAccount("user", "password");

    // set Mail Server for receiving a mail and Port Number 
    // ( domain is automatically resolved )

    _receiver.SetServer(SFXSocketAddress("pop3server.example.com:110"));

    // receive a mail  ( register a callback function )

    _receiver.Receive(CALLBACK_FUNCTION(POP3Callback));
}

// callback funtion for receiving a mail
CALLBACK_IMPLEMENT_SFXPOP3RECEIVER(MyClass, POP3Callback, error)
{
    SInt32 i;

    if (error == SFERR_NO_ERROR) { // if reveiving a mail is successful
        const SFXArray<SFXPOP3Receiver::MailInfoPtr>& mailArray =
            receiver.GetReceivedMailArray();
        TRACE("received %d mails", mailArray.GetSize()); // display numbers

        for (i = 0; i < mailArray.GetSize() ; i++) {
            SFXPOP3Receiver::MailInfoPtr minfo = mailArray[i];
            
            // get mail size, UIDL, mail text including a header 
            // one by one from the left

            TRACE("%d, %s, %s", minfo->size, 
                                minfo->uidl.GetCString(), 
                                minfo->mail.GetCString());

        }
    }
}

File

File Path Class ( SFXPath )

Problem with BREW

There is no interface for handling a file path. The procedure to get a parent directory or change an attribute must be programmed by the developer.

Solution by SophiaFramework UNIVERSE

The SFXPath class eliminates the need to allocate or release memory for String operations. Pre-defined functions are used to get a parent directory or change an attribute.

SFXPath path;
SFXPath temp;

// get an absolute path 

path.Set("/user/admin/log.txt");
TRACE("path = %s", path.GetAbsolute().GetCString());

// get a parent directory 

temp = path.GetParentPath();
TRACE("parent = %s", temp.GetAbsolute().GetCString());

// update an attribute of ".txt" into ".html"

if (path.GetExtension("txt")) {
    path.SetExtension("html");
    TRACE("path = %s", path.GetAbsolute().GetCString());
}

// set a complex path

path.Set("/user/admin/log/../../guest/./log.txt");
TRACE("path = %s", path.GetAbsolute().GetCString());

// normalize a complex path

temp = path.NormalizePath();
TRACE("normalize = %s", temp.GetAbsolute().GetCString());

Directory Class ( SFXDirectory )

Problem with BREW

There is no interface for handling a file paths, and complex programming for file path operations is necessary. Also to delete a non-empty directory, all the files inside it must first be deleted recursively.

Solution by SophiaFramework UNIVERSE

With the SFXPath class, programming for file path operation is very easy. Recursive deletion is supported, and files or directories can be enumarated by an iterator.

SFXPath path("/user/admin/apps/");
SFXDirectory::Enumerator en;

// Only if "/user/admin/" exists, make a directory for apps 

SFXDirectory::Create(path, false);

// get a directory iterator

SFXDirectory::GetDirectoryEnumerator(SFXPath::HomeDirectoryPath(), &en);

// enumerate directories with an iterator

while (en.HasNext()) {
    path = en.GetNext();
    TRACE("dir = %s", path.Get().GetCString());
}

// get a file iterator

SFXDirectory::GetFileEnumerator(SFXPath::HomeDirectoryPath(), &en);

// enumerate files with an iterator

while (en.HasNext()) {
    path = en.GetNext();
    TRACE("file = %s", path.Get().GetCString());
}

// delete directories recursively 

SFXDirectory::Remove(path, true);

File Class ( SFXFile )

Problem with BREW

There is no interface for handling a file path, and complex programming for file path operation is necessary. As was the case with the TCP / IP Socket, programming for creation and restoration of fragmented data is very difficult error-prone.

Solution by SophiaFramework UNIVERSE

With the SFXPath class, programming for file path operations is very easy. As data is read or written through buffered Stream classes, its programming is very concise.

SFXPath path("/sample.txt");
SFXFile file;
SFXAnsiStringStreamWriter writer;
SFXDate date(0);

// get the date when file was created

SFXFile::GetCreateDate(path, &date);

// output a date and  a time with the following format

TRACE("create = %s", date.Format("YYYY/MM/DD hh:mm:ss (Wek)").GetCString());

// delete the file

SFXFile::Remove(path);

// create a new file and write date onto the file

file.OpenReadWrite(path);
file.GetStreamWriter(1024, &writer);

writer << "sophiaframework";
writer.Flush();

file.Close();

Stream

I / O Class for Binary Data ( SFXBinaryStreamReader / SFXBinaryStreamWriter )

Problem with BREW

In case of I / O with IFile or ISocket interface, there is a possibility that all the requested data cannot be inputted / outputted at once. The restoration procedure for the fragmented data must be programmed explicitly.

Solution by SophiaFramework UNIVERSE

An internal ring buffer, allows for the input or output of data of any size. Also data is read and written more efficiently by automatic buffering.

SFXFile file;
SFXBinaryStreamReader reader;
UInt16 index;
SFXAnsiString str;

// open a file

file.OpenReadOnly(SFXPath("/sample.txt"));

// get SFXBinaryStreamReader from a ring buffer of 1024 bytes

file.GetStreamReader(1024, &reader);

// read data from a file

reader.Fetch();

// read data from a ring buffer

reader >> index >> str;

// display data

TRACE("index = %d", index);
TRACE("str = %s", str.GetCString());

I / O Class for String Data ( SFXAnsiStringStreamReader / SFXAnsiStringStreamWriter / SFXWideStringStreamReader / SFXWideStringStreamWriter)

Problem with BREW

In case of I/O with IFile or ISocket interface, there is a possibility that all the requested data cannot be inputtd or outputtd at the same time. The restoration procedure for the fragmented data must be programmed explicitly.

Solution by SophiaFramework UNIVERSE

Similar to an I / O class for Binary Data, using internal ring buffers, input or output of data of any size can be achieved. Also data is read and written more efficiently by automatic buffering. A function to input and output integers or objects automatically converting them into characters is provided.

Buffer

Automatic Management of Buffers

Problem with BREW
Solution by SophiaFramework UNIVERSE

The buffer class allocates and deallocates memory automatically, therefore no memory leaks occur.

String

Intuitive Handling of Strings

Problem with BREW

Programming string processing is complicated.

Solution by SophiaFramework UNIVERSE

With SophiaFramework UNIVERSE, programming string processing becomes intuitive.

e.g. Code for concatenating strings.

BREW:

const char* str1 = "ABC";
const char* str2 = "DEF";
int len1 = STRLEN(str1);
int len2 = STRLEN(str2);
int len3 = len1 + len2;
char* str3 = MALLOC(len3 + 1);
STRCPY(str3, str1, len1);
STRCAT(str3, str2, len3);
 .... Use str3 ....
FREE(str3); // Release memory after using it.

SophiaFramework UNIVERSE:

SFXAnsiString str1("ABC");
SFXAnsiString str2("DEF");
SFXAnsiString str3 = str1 + str2;
 .... Use str3 ....
// NO need to release memory.

Converting ANSI Strings and Wide Strings

Problem with BREW ]

BREW does not support conversion of ANSI strings and Wide strings. Memory must be managed manually.

Solution by SophiaFramework UNIVERSE

With SophiaFramework UNIVERSE, ANSI strings and Wide strings are converted automatically. There is no need to manage memory.

e.g. Code for converting strings

BREW:

  1. Calculate the length of an ANSI string
  2. Allocate a buffer for a Wide string
  3. Convert the ANSI string into a Wide string
  4. Free the buffer
char* astr = "ABC";
int astrLen = STRLEN(astr);
int wstrBufSize = sizeof(AECHAR) * (astrLen + 1);
AECHAR* wstr = MALLOC(wstrBufSize);
STREXPAND((byte*)astr, STRLEN(astr), wstr, wstrBufSize);
 .... Use Wide string wstr ....
FREE(wstr);

SophiaFramework UNIVERSE:

char* astr = "ABC";
SFXWideString wstr(astr);
.... Use the Wide string "wstr" ....
.... No need to deallocate the converted string ....

Functions for String Operations

Problem with BREW

String processing must be implemented by the developer.

Solution by SophiaFramework UNIVERSE

The SophiaFramework UNIVERSE string class eliminates the need to implement string processing.

e.g. Codes for replacing strings

BREW:

  There is no function for substituting strings.

SophiaFramework UNIVERSE:

SFXAnsiString str("I like oranges.");
str = str.Replace("oranges", "apples");

Shapes (Graphics)

Problem with BREW

The developer must implement graphics processing.

Solution by SophiaFramework UNIVERSE

There is no need to implement shape processing, because it is provided in Shape classes.

Ex1. Code for moving a rectangle

BREW:

AEERect rect;
rect.x += 10;
rect.y += 10;

SophiaFramework UNIVERSE:

SFXRectangle rectangle;
rectangle.Offset(10,10); 

Ex2. Codes for obtaining information about the top edge of a rectangle

BREW:

AEERect rect;
AEELine line;
line.sx = rect.x;
line.sy = rect.y;
line.ex = rect.x + rect.dx - 1;
line.ey = rect.y + rect.dy - 1;

SophiaFramework UNIVERSE:

SFXRectangle rectangle;
SFXLine line;
line = rectangle.GetEdgeTop();

Color

Same as Shape.

Color operations are straightforward with SophiaFramework UNIVERSE.

Collection

Problem with BREW

Processing for dynamic data, which can be very complicated, must be implemented by the developer.

Solution by SophiaFramework UNIVERSE

No need to implement dynamic data processing, since it is provided through the Collection classes.

Ex. Code for dynamic array

BREW:

int* ar = NULL;
int arSize = 0;
ar = REALLOC(ar, sizeof(int) * (arSize + 1));
ar[arSize++] = 100;
ar = REALLOC(ar, sizeof(int) * (arSize + 1));
ar[arSize++] = 200;
ar = REALLOC(ar, sizeof(int) * (arSize + 1));
ar[arSize++] = 300;
DBGPRINTF("%d", ar[0] + ar[1] + ar[2]);
FREE(ar); // Release after use.
  // Forgetting the "+ 1" is a bug that is hard to find.

SophiaFramework UNIVERSE:

SFXArray<SInt32> ar;
ar.Append(100);
ar.Append(200);
ar.Append(300);
DBGPRINTF("%d", ar[0] + ar[1] + ar[2]); 
// You can access as if it is a normal array.
// Memory is released automatically.

Mathematical Operations

Floating-point Type ( Float32, Float64 )

Problem with BREW

Floating-point operations require function calls. There are no trigonometric functions or exponential functions available.

Solution by SophiaFramework UNIVERSE

Floating-point operations can be used in the form of general numerical expressions. Trigonometric and exponential functions are also included.

Ex. Code for ( x + y ) * z

BREW:

double x, y, z;
z = FMUL(FADD(x, y), z);

SophiaFramework UNIVERSE:

Float x, y, z;
z = ( x  +  y )  *  z;

Random Number Classes (SFXBrewRandom, SFXLCGRandom, SFXMTRandom)

Problem with BREW

The random numbers function cannot be used to initialize variables.

Solution by SophiaFramework UNIVERSE

The random numbers function can be used to set initial values. There are three types of random number functions: BREW native, linear congruential generators (LCG), and Mersenne Twister algorithms.

Trigonometric Function Table Class (SFXTrigonometric)

Problem with BREW

There are no trigonometric funcions.

Solution by SophiaFramework UNIVERSE

Calculation of trigonometric functions is accelerated by use of the Trigonometric Funtion Table.

General Purpose Utilities

Date Class (SFXDate)

Problem with BREW

Date calculations must be managed by the developer

Solution by SophiaFramework UNIVERSE

The need to implement date calculations is eliminated through use of SophiaFramework UNIVERSE date functions.

Class (SFXHelper)

Problem with BREW

Calls to helper functions increases the size of a program due to BREW added functionalities.

Solution by SophiaFramework UNIVERSE

Calling a helper function with SophiaFramework UNIVERSE does not augment program size.

Ex. Code for allocating memory

BREW:

void* buffer = MALLOC(256);// 28 bytes after compilation       

SophiaFramework UNIVERSE:

void* buffer = SFUHelper::malloc(256);//8 bytes after compilation ( 20 bytes saved )  

Class for Saving Settings (SFXConfig)

Problem with BREW

There is no class for loading and saving settings.

Solution by SophiaFramework UNIVERSE

SophiaFramework UNIVERSE provides a class that loads and saves settings automatically.

Graphics Drawing Class (SFXGraphics)

Problem with BREW

Both the IDisplay and IGraphics drawing interfaces must be managed by the developer.

Solution by SophiaFramework UNIVERSE

The IDisplay and IGraphics drawing interfaces are combined into a single class.

Ex. Code for drawing strings in a rectangle

BREW:

Requires custom implementation.

SophiaFramework UNIVERSE:

Simply call the SFXGraphics::DrawString() function.

Debugging

Memory Leak Detection

Problem with BREW

BREW's memory leak detection system is not compatible with C++.

Solution by SophiaFramework UNIVERSE

Memory leaks can be detected even when using C++.

BREW C++ Wrappers

Problem with BREW

Programs in C language are less comprehensible than those in C++. Memory leaks occur when you the release interfaces is forgotten.

Solution by SophiaFramework UNIVERSE

SophiaFramework UNIVERSE's C++ wrappers allow an application to be coded in a complete Object-Oriented style. Interfaces are automatically released following their use.

Ex. Calling the Restart function of the of BREW API's Hash interface

Using C++ Wrappers with Utility Libraries

In SophiaFramework UNIVERSE, BREW API wrappers can communicate with Utility Libraries such as String and Buffer.

e.g. Calling the Update function of of BREW APIs Hash interface

BREW:

Both a buffer object and its size must be passed.

SophiaFramework UNIVERSE:

Only the buffer object needs to be passed.