Index: .fossil-settings/ignore-glob ================================================================== --- .fossil-settings/ignore-glob +++ .fossil-settings/ignore-glob @@ -17,5 +17,6 @@ config.log config.status configure extra.mk tests/tests +tests/tests.db Index: ObjMatrix.oc ================================================================== --- ObjMatrix.oc +++ ObjMatrix.oc @@ -1,4 +1,5 @@ package_format 1 package_depends_on ObjOpenSSL +package_depends_on ObjSQLite3 LIBS="-lobjmatrix $LIBS" FRAMEWORK_LIBS="-framework ObjMatrix $FRAMEWORK_LIBS" Index: README.md ================================================================== --- README.md +++ README.md @@ -7,19 +7,20 @@ It is currently in early development stages. ## How to build it? -You need [ObjFW](https://objfw.nil.im) and -[ObjOpenSSL](https://fossil.nil.im/objopenssl) installed in order to do this. +You need [ObjFW](https://objfw.nil.im), +[ObjOpenSSL](https://fossil.nil.im/objopenssl) and +[ObjSQLite3](https://fossil.nil.im/objsqlite3) installed in order to do this. ObjMatrix uses modern Objective-C, and hence cannot be compiled with GCC, but only with Clang. So install Clang first and ObjFW will automatically pick it up. You can install them all like this: - $ for i in objfw objopenssl objmatrix; do + $ for i in objfw objopenssl objsqlite3 objmatrix; do fossil clone https://fossil.nil.im/$i $i.fossil && mkdir $i && cd $i && fossil open ../$i.fossil && ./autogen.sh && Index: configure.ac ================================================================== --- configure.ac +++ configure.ac @@ -18,10 +18,15 @@ AS_IF([$OBJFW_CONFIG --package ObjOpenSSL], [ OBJFW_CONFIG_FLAGS="$OBJFW_CONFIG_FLAGS --package ObjOpenSSL" ], [ AC_MSG_ERROR(ObjOpenSSL not found!) +]) +AS_IF([$OBJFW_CONFIG --package ObjSQLite3], [ + OBJFW_CONFIG_FLAGS="$OBJFW_CONFIG_FLAGS --package ObjSQLite3" +], [ + AC_MSG_ERROR(ObjSQLite3 not found!) ]) test x"$OBJC" = x"" && OBJC="$($OBJFW_CONFIG --objc)" AC_LANG([Objective C]) Index: src/MTXClient.h ================================================================== --- src/MTXClient.h +++ src/MTXClient.h @@ -19,10 +19,12 @@ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ #import + +#import "MTXStorage.h" OF_ASSUME_NONNULL_BEGIN @class MTXClient; @@ -83,43 +85,64 @@ /** * @brief The homeserver used by the client. */ @property (readonly, nonatomic) OFURL *homeserver; +/** + * @brief The storage used by the client. + */ +@property (readonly, nonatomic) id storage; + /** * @brief Creates a new client with the specified access token on the specified * homeserver. * + * @param userID The user ID for the client + * @param deviceID The device ID for the client * @param accessToken The access token for the client * @param homeserver The URL of the homeserver + * @param storage The storage the client should use * @return An autoreleased MTXClient */ + (instancetype)clientWithUserID: (OFString *)userID deviceID: (OFString *)deviceID accessToken: (OFString *)accessToken - homeserver: (OFURL *)homeserver; + homeserver: (OFURL *)homeserver + storage: (id )storage; /** * @brief Logs into the homeserver and creates a new client. + * + * @param user The user to log into + * @param password The password to log in with + * @param homeserver The homeserver to log into + * @param storage The storage the client should use + * @param block A block to call once login succeeded or failed */ + (void)logInWithUser: (OFString *)user password: (OFString *)password homeserver: (OFURL *)homeserver + storage: (id )storage block: (mtx_client_login_block_t)block; /** * @brief Initializes an already allocated client with the specified access * token on the specified homeserver. * + * @param userID The user ID for the client + * @param deviceID The device ID for the client * @param accessToken The access token for the client * @param homeserver The URL of the homeserver + * @param storage The storage the client should use * @return An initialized MTXClient */ - (instancetype)initWithUserID: (OFString *)userID deviceID: (OFString *)deviceID accessToken: (OFString *)accessToken - homeserver: (OFURL *)homeserver OF_DESIGNATED_INITIALIZER; + homeserver: (OFURL *)homeserver + storage: (id )storage + OF_DESIGNATED_INITIALIZER; /** * @brief Logs out the device and invalidates the access token. * * @warning The client can no longer be used after this succeeded! Index: src/MTXClient.m ================================================================== --- src/MTXClient.m +++ src/MTXClient.m @@ -49,20 +49,23 @@ @implementation MTXClient + (instancetype)clientWithUserID: (OFString *)userID deviceID: (OFString *)deviceID accessToken: (OFString *)accessToken homeserver: (OFURL *)homeserver + storage: (id )storage { return [[[self alloc] initWithUserID: userID deviceID: deviceID accessToken: accessToken - homeserver: homeserver] autorelease]; + homeserver: homeserver + storage: storage] autorelease]; } + (void)logInWithUser: (OFString *)user password: (OFString *)password homeserver: (OFURL *)homeserver + storage: (id )storage block: (mtx_client_login_block_t)block { void *pool = objc_autoreleasePoolPush(); validateHomeserver(homeserver); @@ -125,15 +128,15 @@ return; } } else realHomeserver = homeserver; - MTXClient *client = [MTXClient - clientWithUserID: userID - deviceID: deviceID - accessToken: accessToken - homeserver: realHomeserver]; + MTXClient *client = [MTXClient clientWithUserID: userID + deviceID: deviceID + accessToken: accessToken + homeserver: realHomeserver + storage: storage]; block(client, nil); }]; objc_autoreleasePoolPop(pool); } @@ -140,10 +143,11 @@ - (instancetype)initWithUserID: (OFString *)userID deviceID: (OFString *)deviceID accessToken: (OFString *)accessToken homeserver: (OFURL *)homeserver + storage: (id )storage { self = [super init]; @try { validateHomeserver(homeserver); @@ -150,10 +154,11 @@ _userID = [userID copy]; _deviceID = [deviceID copy]; _accessToken = [accessToken copy]; _homeserver = [homeserver copy]; + _storage = [storage retain]; } @catch (id e) { [self release]; @throw e; } @@ -164,10 +169,11 @@ { [_userID release]; [_deviceID release]; [_accessToken release]; [_homeserver release]; + [_storage release]; [super dealloc]; } - (OFString *)description ADDED src/MTXSQLite3Storage.h Index: src/MTXSQLite3Storage.h ================================================================== --- /dev/null +++ src/MTXSQLite3Storage.h @@ -0,0 +1,48 @@ +/* + * Copyright (c) 2020, Jonathan Schleifer + * + * https://fossil.nil.im/objmatrix + * + * Permission to use, copy, modify, and/or distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice is present in all copies. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#import "MTXStorage.h" + +OF_ASSUME_NONNULL_BEGIN + +/** + * @brief SQLite3-based storage for @ref MTXClient. + */ +@interface MTXSQLite3Storage: OFObject +/** + * @brief Creates a new SQLite3-based storage for @ref MTXClient. + * + * @param path The path for the SQLite3 database + * @return An autoreleased MTXSQLite3Storage + */ ++ (instancetype)storageWithPath: (OFString *)path; + +/** + * @brief Initializes an already allocated MTXSQLite3Storage. + * + * @param path The path for the SQLite3 database + * @return An initialized MTXSQLite3Storage + */ +- (instancetype)initWithPath: (OFString *)path OF_DESIGNATED_INITIALIZER; +@end + +OF_ASSUME_NONNULL_END ADDED src/MTXSQLite3Storage.m Index: src/MTXSQLite3Storage.m ================================================================== --- /dev/null +++ src/MTXSQLite3Storage.m @@ -0,0 +1,57 @@ +/* + * Copyright (c) 2020, Jonathan Schleifer + * + * https://fossil.nil.im/objmatrix + * + * Permission to use, copy, modify, and/or distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice is present in all copies. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#import + +#import "MTXSQLite3Storage.h" + +@implementation MTXSQLite3Storage +{ + SL3Connection *_conn; +} + ++ (instancetype)storageWithPath: (OFString *)path +{ + return [[[self alloc] initWithPath: path] autorelease]; +} + +- (instancetype)initWithPath: (OFString *)path +{ + self = [super init]; + + @try { + _conn = [[SL3Connection alloc] initWithPath: path]; + } @catch (id e) { + [self release]; + @throw e; + } + + return self; +} + +- (void)dealloc +{ + [_conn release]; + + [super dealloc]; +} +@end ADDED src/MTXStorage.h Index: src/MTXStorage.h ================================================================== --- /dev/null +++ src/MTXStorage.h @@ -0,0 +1,33 @@ +/* + * Copyright (c) 2020, Jonathan Schleifer + * + * https://fossil.nil.im/objmatrix + * + * Permission to use, copy, modify, and/or distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice is present in all copies. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#import + +OF_ASSUME_NONNULL_BEGIN + +/** + * @brief A protocol for a storage to be used by @ref MTXClient. + */ +@protocol MTXStorage +@end + +OF_ASSUME_NONNULL_END Index: src/Makefile ================================================================== --- src/Makefile +++ src/Makefile @@ -6,13 +6,15 @@ STATIC_LIB = ${OBJMATRIX_STATIC_LIB} FRAMEWORK = ${OBJMATRIX_FRAMEWORK} LIB_MAJOR = ${OBJMATRIX_LIB_MAJOR} LIB_MINOR = ${OBJMATRIX_LIB_MINOR} -SRCS = MTXClient.m \ +SRCS = MTXClient.m \ + MTXSQLite3Storage.m \ MTXRequest.m INCLUDES := ${SRCS:.m=.h} \ + MTXStorage.h \ ObjMatrix.h OBJS_EXTRA = ${EXCEPTIONS_EXCEPTIONS_A} LIB_OBJS_EXTRA = ${EXCEPTIONS_EXCEPTIONS_LIB_A} Index: src/ObjMatrix.h ================================================================== --- src/ObjMatrix.h +++ src/ObjMatrix.h @@ -20,10 +20,12 @@ * POSSIBILITY OF SUCH DAMAGE. */ #import "MTXClient.h" #import "MTXRequest.h" +#import "MTXSQLite3Storage.h" +#import "MTXStorage.h" #import "MTXFetchRoomListFailedException.h" #import "MTXJoinRoomFailedException.h" #import "MTXLeaveRoomFailedException.h" #import "MTXLoginFailedException.h" Index: tests/tests.m ================================================================== --- tests/tests.m +++ tests/tests.m @@ -45,13 +45,16 @@ @"the environment!\n"]; [OFApplication terminateWithStatus: 1]; } OFURL *homeserver = [OFURL URLWithString: environment[@"OBJMATRIX_HS"]]; + id storage = + [MTXSQLite3Storage storageWithPath: @"tests.db"]; [MTXClient logInWithUser: environment[@"OBJMATRIX_USER"] password: environment[@"OBJMATRIX_PASS"] homeserver: homeserver + storage: storage block: ^ (MTXClient *client, id exception) { if (exception != nil) { of_log(@"Error logging in: %@", exception); [OFApplication terminateWithStatus: 1]; }